[UPDATE] Amazon IVSでライブストリームの入力を監視できる新たなCloudWatch MetricsとAPIが追加されました!
はじめに
清水です。本日お届けするアップデート情報はこちら!AWSのマネージド型ライブストリーミングソリューションであるAmazon IVS (Amazon Interactive Video Service)でライブストリームの入力を監視する新たなCloudWatch MetricsとAPIが追加されました!(2021/11/18付でポストされたアップデート情報です。)
- Amazon Interactive Video Service adds high resolution metrics for monitoring stream health
- Amazon Interactive Video Service がストリーミングヘルスのモニタリングのための高解像度のメトリクスを追加
このアップデートと同じタイミング(2021/11/18付)でAmazon Interactive Video ServiceのAPIについても更新(2つの新しいAPI methodsの追加と、2つのAPI methodsの更新)がされています。
またユーザガイドのRelease Notesの項目では「Stream Health」として紹介されています。
本エントリではこのAmazon IVSのアップデートについて、詳細を確認してみたのでまとめてみます。本アップデートに関するマネジメントコンソールの更新もあり、Amazon IVSでライブストリームの入力(Ingest)の確認や監視がぐっと容易になるアップデートかと思います。
Amazon IVSに新たに追加されたIngest確認用のCloudWatch Metrics
まずは新たに追加されたCloudWatch Metricsを確認してみましょう。IVSのユーザガイドの以下のページに記載があります。
追加されたCloudWatchメトリクスは以下の4つです。説明部分は上記ドキュメントページ(英語)の内容をGoogle翻訳で変換したものを記載しています。(2021/11/29時点で日本版ドキュメントにはまだ反映がされていないようですので、詳細は英語版ドキュメントを参照しましょう。)
- IngestAudioBitrate
- ストリーミング時にAmazonIVSが受信するオーディオデータの量。ビットレートが高いほど、利用可能なインターネット帯域幅が多く使用されます。
- IngestFramerate
- ストリーミング時にAmazonIVSがアニメーションフレームを受信する頻度。
- IngestVideoBitrate
- ストリーミング時にAmazonIVSが受信するビデオデータの量。ビットレートが高いほど、利用可能なインターネット帯域幅が多く使用されます。ビットレートを高くするとビデオ品質が向上しますが、それは特定のポイントまでです。
- KeyframeInterval
- 前のフレームとの違いだけでなく、フレーム全体が送信されるビデオストリーム内のポイント。
いずれのメトリクスもDimensionはChannelとなり、Channelごとの状況が監視できます。またHigh-resolution metric(高解像度メトリック)として、1秒単位のメトリックが参照可能です。ただし利用できるのは3時間まで、3時間以降の最も解像度の高いメトリックは60秒単位となります。(CloudWatchの高分解能カスタムメトリクスの保持期間が適用されます。「すべてのメトリクスの保存期間はどうなっていますか?」 - よくある質問 - Amazon CloudWatch | AWS)
Amazon IVSに新たに追加されたstreaming session確認用のAPI
続いて新たにIVSに追加されたAPIについても確認しておきましょう。1つ目はListStreamSessions
です。AWS CLIだとivs list-stream-sessions
コマンドが該当します。アカウント内の指定されたChannelの現在及び過去のストリームの概要を取得することができます。(APIについては、本エントリ後半で実際の使用例を確認します。)
新たに追加されたAPIの2つ目はGetStreamSessionです。AWS CLIだとivs get-stream-session
が該当します。コマンド実行時に指定したストリームの詳細メタデータを取得することができます。ListStreamSessions
の詳細版というイメージで良いかと思います。
以上、ListStreamSessions
とGetStreamSession
が新たに追加された2つのAPIです。またAPIの更新については、ListStreams
のAPIでStream Healthによるフィルタリング機能の追加、ならびにレスポンスにstreamId
が追加され、またGetStream
のAPIでも同様にstreamId
がレスポンスに追加されています。AWS CLIではivs list-streams
とivs get-stream
コマンドがそれぞれ該当します。
詳細については、上記AWS CLIの各コマンドのドキュメントや本エントリ冒頭でも示したAWS API Changesをご確認ください。
実際のライブストリーミング中にIVSのStream Healthを確認してみる
ドキュメントなどをもとにアップデートされたCloudWatch MetricsならびにAPIを確認してみました。さらに実際にIVSを使ってライブストリーミングを行い、どのようにStream Healthが確認できるかみてみましょう。
マネジメントコンソールからの確認
まずはマネジメントコンソールからIVSのChannelを作成します。コントロールプレーン *1のリージョンはオレゴン(us-west-2)を選択しました。Channel nameは「channel-1」とし、その他の項目はデフォルトのまま[Create Channel]します。
Channel作成後、Stream configurationをストリーミングソフトウェアに設定してライブストリーミングを開始します。今回はiPhone XS上でZixi ONAIRを使用しました。
ライブストリーミング開始後、マネジメントコンソールのIVSの該当Channelの画面、Playback configurationの下にStream sessionsの項目がありますね。 *2Stream IDの文字列をクリックして進んでみましょう。
Stream overviewとHealthy
の表示、そしてCloudWatch Metricsへのリンク。さらにはEventsとして、SessionのCreate、Startの時刻が表示されていますね。さらに画面を下にスクロールすると、Encoder settingsの項目も表示されます。詳細は後述しますが、これらストリームの詳細情報については新たに追加されたGetStreamSession
APIから取得可能なものです。
続いて[View in CloudWatch]のリンクから新たに追加されたCloudWatch Metricsを確認してみましょう。以下のようにIVSへIngestされているVideo/Audioのビットレート、フレームレート、そしてキーフレームインターバルが表示されます。この[View in CloudWatch]のリンクからCloudWatchのマネジメントコンソールに飛ぶとPeriod 5秒で表示されています。Y軸が適切に設定されている点も嬉しいポイントですね。
Periodは最短の1秒にも変更可能です。
ここでストリーミングソフトウェア側でいちどライブストリーミングをストップ、さらにエンコード設定を少し変更してみます。Ingestする解像度とビットレートの設定について、ストリーミングを一時停止する前は1080p30 5000kbps
だったものを、720p30 3000kbps
としてみます。
これでストリーミングソフトウェアからのIngestを再開します。マネジメントコンソールのChannel画面、Stream sessionsの項目で1つ目(さきほどLIVEだったもの)のほか、もう1つのStreamが現れ、こんどはこちらがLIVEになっています。
1つ目(この段階でLIVEになっていないほう)のStreamのほうを確認してみると、以下のようにOfflineとなり、EventsにSession Endedが記録されていることがわかります。
2つ目の、この段階でLIVEマークがついているほうのStreamは以下のようになります。
ページを下にスクロールして、Encoder settingsを確認してみましょう。変更したResolution/Target bitrateが変わっていることが確認できますね。
[View in CloudWatch]からIngestに関するメトリクスも確認してましょう。こちらもVideoビットレートが3Mbpsに変わっていることを確認することができました。
AWS CLIを使った確認
マネジメントコンソールからStream IDごとのStreamの状態や、CloudWatch Metricsなどが確認できました。Stream HealthについてAWS CLIを使ってAPIレベルでの確認も行ってみみあしょう。
まずはストリーミングを中断する前の(1つ目のStream session)を使用している状態です。まずはivs list-streams
コマンドとivs get-stream
コマンドです。新たに追加されているstreamID
などが確認できますね。
% aws ivs list-streams --region us-west-2 { "streams": [ { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX", "health": "HEALTHY", "startTime": "2021-11-28T17:04:04+00:00", "state": "LIVE", "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX", "viewerCount": 2 } ] }
% aws ivs get-stream --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --region us-west-2 "stream": { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX", "health": "HEALTHY", "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8", "startTime": "2021-11-28T17:04:04+00:00", "state": "LIVE", "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX", "viewerCount": 1 } }
続いて、新しく追加されたivs live-stream-sessions
とget-stream-session
コマンドです。get-stream-session
コマンドのほうでは、ingestConfiguration
やtruncatedEvents
などで詳細な情報が確認可能です。
% aws ivs list-stream-sessions --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --region us-west-2 { "streamSessions": [ { "hasErrorEvent": false, "startTime": "2021-11-28T17:03:57+00:00", "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX" } ] }
% aws ivs get-stream-session --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --stream-id st-1DtG0XXXXXXXXXXXXXXXXXX --region us-west-2 { "streamSession": { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX", "authorized": false, "ingestEndpoint": "2893XXXXXXXX.global-contribute.live-video.net", "latencyMode": "LOW", "name": "channel-1", "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8", "recordingConfigurationArn": "", "type": "STANDARD" }, "ingestConfiguration": { "audio": { "channels": 1, "codec": "mp4a.40.2", "sampleRate": 48000, "targetBitrate": 96000 }, "video": { "avcLevel": "4.0", "avcProfile": "High", "codec": "avc1.640028", "encoder": "", "targetBitrate": 5000000, "targetFramerate": 30, "videoHeight": 1080, "videoWidth": 1920 } }, "startTime": "2021-11-28T17:03:57+00:00", "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX", "truncatedEvents": [ { "eventTime": "2021-11-28T17:04:04+00:00", "name": "Stream Start", "type": "IVS Stream State Change" }, { "eventTime": "2021-11-28T17:03:57+00:00", "name": "Session Created", "type": "IVS Stream State Change" } ] } }
続いて、ストリーミングを一時中断してストリーミングソフトウェア側でIngestする解像度とビットレートを変更、再開後のライブストリーミング中のAWS CLIの実行結果です。ivs list-streams
コマンドとivs get-stream
コマンドの実行結果では、StreamID
が変わっていることが確認できます。
% aws ivs list-streams --region us-west-2 { "streams": [ { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX", "health": "HEALTHY", "startTime": "2021-11-28T17:10:48+00:00", "state": "LIVE", "streamId": "st-1DxirXXXXXXXXXXXXXXXXXX", "viewerCount": 1 } ] }
% aws ivs get-stream --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --region us-west-2 { "stream": { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX", "health": "HEALTHY", "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8", "startTime": "2021-11-28T17:10:48+00:00", "state": "LIVE", "streamId": "st-1DxirXXXXXXXXXXXXXXXXXX", "viewerCount": 1 } }
続いて新しく追加されたivs live-stream-sessions
コマンドです。現在のStreamID
のほか、さきほど(中断前の)StreamID
についても確認が可能です。中断前のStreamSessionについては、endTime
の項目が追加されています。
% aws ivs list-stream-sessions --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --region us-west-2 { "streamSessions": [ { "hasErrorEvent": false, "startTime": "2021-11-28T17:10:40+00:00", "streamId": "st-1DxirXXXXXXXXXXXXXXXXXX" }, { "endTime": "2021-11-28T17:09:53+00:00", "hasErrorEvent": false, "startTime": "2021-11-28T17:03:57+00:00", "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX" } ] }
ivs get-stream-session
コマンドで1つ目、中断前のStream Sessionの詳細情報を確認してみます。truncatedEvents
でStream End
とSession End
が確認できます。
% aws ivs get-stream-session --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --stream-id st-1DtG0XXXXXXXXXXXXXXXXXX --region us-west-2 { "streamSession": { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX", "authorized": false, "ingestEndpoint": "2893XXXXXXXX.global-contribute.live-video.net", "latencyMode": "LOW", "name": "channel-1", "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8", "recordingConfigurationArn": "", "type": "STANDARD" }, "endTime": "2021-11-28T17:09:53+00:00", "ingestConfiguration": { "audio": { "channels": 1, "codec": "mp4a.40.2", "sampleRate": 48000, "targetBitrate": 96000 }, "video": { "avcLevel": "4.0", "avcProfile": "High", "codec": "avc1.640028", "encoder": "", "targetBitrate": 5000000, "targetFramerate": 30, "videoHeight": 1080, "videoWidth": 1920 } }, "startTime": "2021-11-28T17:03:57+00:00", "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX", "truncatedEvents": [ { "eventTime": "2021-11-28T17:09:53+00:00", "name": "Session Ended", "type": "IVS Stream State Change" }, { "eventTime": "2021-11-28T17:09:53+00:00", "name": "Stream End", "type": "IVS Stream State Change" }, { "eventTime": "2021-11-28T17:04:04+00:00", "name": "Stream Start", "type": "IVS Stream State Change" }, { "eventTime": "2021-11-28T17:03:57+00:00", "name": "Session Created", "type": "IVS Stream State Change" } ] } }
中断後の2つ目のStream Sessionの詳細情報を、同じくivs get-stream-session
コマンドで確認してみます。Stream/Sessionの終了(End)の情報はありません。またマネジメントコンソールで確認したように、ここでもtargetBitrateと解像度(videoHeight, videoWidth)が変わっていることが確認できます。
2つ目のセッションは、
% aws ivs get-stream-session --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --stream-id st-1DxirXXXXXXXXXXXXXXXXXX --region us-west-2 { "streamSession": { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX", "authorized": false, "ingestEndpoint": "2893XXXXXXXX.global-contribute.live-video.net", "latencyMode": "LOW", "name": "channel-1", "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8", "recordingConfigurationArn": "", "type": "STANDARD" }, "ingestConfiguration": { "audio": { "channels": 1, "codec": "mp4a.40.2", "sampleRate": 48000, "targetBitrate": 96000 }, "video": { "avcLevel": "3.1", "avcProfile": "High", "codec": "avc1.64001F", "encoder": "", "targetBitrate": 3000000, "targetFramerate": 30, "videoHeight": 720, "videoWidth": 1280 } }, "startTime": "2021-11-28T17:10:40+00:00", "streamId": "st-1DxirXXXXXXXXXXXXXXXXXX", "truncatedEvents": [ { "eventTime": "2021-11-28T17:10:48+00:00", "name": "Stream Start", "type": "IVS Stream State Change" }, { "eventTime": "2021-11-28T17:10:40+00:00", "name": "Session Created", "type": "IVS Stream State Change" } ] } }
まとめ
Amazon IVSでストリームの状態(Stream Health)を確認するために新たに追加されたCloudWatchメトリクスとAPIについて確認してみました。Amazon IVS側でどのような状態でストリーム(Ingest)を受けているかの確認が用意にできるようになりました。問題発生時の原因調査なども行いやすくなりますね。またCloudWatchメトリクスからアラーム等に連携し、問題が発生したときの早期発見にもつなげられるかなと思いました。
Amazon IVSについては簡単にライブストリーミングができることが魅力のサービスですが、そこにより詳細な状態監視機能が加わった、大変うれしいアップデートだなと思いました。
脚注
- Amazon IVSではほか多くのAWSサービスと異なり、グローバルなデータプレーンとリージョナルなコントロールプレーンで構成されています。ということがここ最近IVSユーザガイドの冒頭ページに記載されるようになりましたね。 ↩
- 私の記憶違いでなければこれまでこの項目はなく、今回のアップデートで追加された箇所かと思います。 ↩